import java.util.Scanner;

/**
 * 九宫格按键输入
 * 
 * 题目描述

九宫格按键输入，有英文和数字两个模式，默认是数字模式，数字模式直接输出数字，英文模式连续按同一个按键会依次出现这个按键上的字母，如果输入 "/" 或者其他字符，则循环中断，输出此时停留的字母。

数字和字母的对应关系如下，注意 0 只对应空格：



输入一串按键，要求输出屏幕显示

# 用于切换模式，默认是数字模式，执行 # 后切换为英文模式；
/ 表示延迟，例如在英文模式下，输入 22/222，显示为 bc，数字模式下 / 没有效果；
英文模式下，多次按同一键，例如输入 22222，显示为 b；
输入描述
输入范围为数字 0~9 和字符 '#'、'/'，输出屏幕显示，例如：

在数字模式下，输入 1234，显示 1234
在英文模式下，输入 1234，显示 ,adg
输出描述
输出屏幕显示的字符

用例
输入	2222/22
输出	222222
说明	默认数字模式，字符直接显示，数字模式下/无序
输入	#2222/22
输出	ab
说明	#进入英文模式，连续的数字输入会循环选择字母，直至输入/，故第一段2222输入显示a，第二段22输入显示b
输入	#222233
输出	ae
说明	#进入英文模式，连续的数字输入会循环选择字母，直至输入其他数字，故第一段2222输入显示a，第二段33输入显示e

 */

 /*
  * 
  题目解析
本题主要考察逻辑模拟。

首先，我们可以创建一个长度为10的数组，数组索引与数字0~9对应，数组元素就是数字对应的字母集合（字符串）。具体可以看代码实现中dic数组。

然后，本题的按键逻辑如下：

我们可以定义两个变量：delay_num 记录英文模式下按键数字，delay_idx 记录英文模式下当前按键数字停留的字母索引位置。
比如 dic[delay_num][delay_idx] 就是英文模式下，当前按键停留的字母。
遍历输入串 s 的每一个字符 c： 

c == '#'：切换模式，并且有打断英文字母切换的功能
c == '/'：打断英文字母切换的功能
其他情况：
如果当前是数字模式，则当前按键（数字）直接录入结果
如果当前是英文模式，则看当前按键和上一次按键是否相同：

若相同，则进行英文字母切换，即 delay_idx = (delay_idx + 1) % dic[delay_num].length

若不相同，则打断英文字母切换的功能，上一次按键停留的英文字母 dic[delay_num][delay_idx] 录入结果，并更新当前按键为英文切换的按键：delay_num = c -  '0'，delay_idx = 0
按照上面逻辑，处理完输入串即可。

  */
public class 九宫格按键输入 {

    // 数字（数组索引）和字母（数组元素）的映射关系
    static String[] dic = {" ", ",.", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
 
    // 当前是否为数字模式
    static boolean isNumMode = true;
 
    // 英文模式下, 数字 delay_num 切换到了 delay_idx 字母, 比如 delay_num = 2, delay_idx = 1, 表示字母 'a', 即: dic[delay_num][delay_idx]
    static int delay_num = -1;
    static int delay_idx = -1;
 
    // 记录结果
    static StringBuilder sb = new StringBuilder();
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
 
        // 尾部追加一个 '/', 可以避免收尾操作, 也不影响结果
        String s = sc.nextLine() + "/";
 
        // 遍历输入串
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
 
            // 切换模式
            if (c == '#') {
                isNumMode = !isNumMode;
            }
 
            if (c == '#' || c == '/') {
                // # 和 / 都会打断英文字母切换动作
                interrupt(c);
            } else if (isNumMode) {
                // 数字模式下, 数字直接录入结果
                sb.append(c);
            } else if (c - '0' == delay_num) {
                // 英文模式下, 如果当前按键c和上一次按键delay_num相同, 则进行英文字母切换
                delay_idx++;
                delay_idx %= dic[delay_num].length(); // 避免越界
            } else {
                // 英文模式下, 如果当前按键c和上一次按键delay_num不相同, 则打断英文字母切换动作
                interrupt(c);
            }
        }
 
        System.out.println(sb);
    }
 
    // 按键c如果可以打断英文切换
    public static void interrupt(char c) {
        // 如果之前有英文输入
        if (delay_num != -1) {
            // 则循环中断，输出此时停留的字母
            sb.append(dic[delay_num].charAt(delay_idx));
        }
 
        // 更新delay_num和delay_idx
        if (c == '#' || c == '/') {
            delay_num = -1;
            delay_idx = -1;
        } else {
            delay_num = c - '0';
            delay_idx = 0;
        }
    }
    
}
